package com.xxxx.crm.controller;

import com.xxxx.crm.base.BaseController;
import com.xxxx.crm.base.ResultInfo;
import com.xxxx.crm.exceptions.ParamsException;
import com.xxxx.crm.model.UserModel;
import com.xxxx.crm.service.UserService;
import com.xxxx.crm.utils.LoginUserUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * Created by HMF on 2021/07/20 12:53
 */
@Controller
@RequestMapping("user")
public class UserController extends BaseController {
    // Controller层调用Service层，所以注入对应的Service层对象
    @Resource
    private UserService userService;

    /**
     * 用户登录
     *
     * @param userName
     * @param userPwd
     * @return
     */
    @PostMapping("login")
    @ResponseBody  // 不是返回页面需要加上这个注解，（因为前台请求这个是AJAX请求，返回的是一个对象）
    public ResultInfo userLogin(String userName, String userPwd) {
        // ResultInfo用于封装返回给前端的数据
        ResultInfo resultInfo = new ResultInfo();

//        // 调用service层的登录方法
//        UserModel userModel = userService.userLogin(userName, userPwd);
//
//        // 登录成功后，设置ResultInfo的result的值（将数据返回给请求）
//        resultInfo.setResult(userModel);


        // 通过 try-catch 捕获service层的异常，如果service层抛出异常，则表示登录失败，否则登录成功
        try {

            // 调用service层的登录方法
            UserModel userModel = userService.userLogin(userName, userPwd);

            // 登录成功后，设置ResultInfo的result的值（将数据返回给请求）
            resultInfo.setResult(userModel);

        } catch (ParamsException p) { // 捕获自定义的异常信息
            resultInfo.setCode(p.getCode());
            resultInfo.setMsg(p.getMsg());
            p.printStackTrace();

        } catch (Exception e) {
            resultInfo.setCode(500);
            resultInfo.setMsg("登录失败！");
            e.printStackTrace();
        }

        return resultInfo;
    }


    /**
     * 用户修改密码：
     * --1.通过形参接收前端传递的参数 （原始密码、新密码、确认密码）
     * --2.通过request对象，获取设置在cookie中的用户ID
     * --3.调用Service层修改密码的方法，得到ResultInfo对象
     * --4.返回ResultInfo对象
     *
     * @param request
     * @param oldPassword
     * @param newPassword
     * @param repeatPassword
     * @return
     */
    @PostMapping("updatePwd")
    @ResponseBody  // 不是返回页面，所以需要加上该注解
    public ResultInfo updateUserPassword(HttpServletRequest request, String oldPassword,
                                         String newPassword, String repeatPassword) {
        ResultInfo resultInfo = new ResultInfo();

//        // 获取浏览器请求访问时携带的cookie中的userId
//        Integer userId = LoginUserUtil.releaseUserIdFromCookie(request);
//        // 调用Service层修改密码的方法
//        userService.updatePassWord(userId, oldPassword, newPassword, repeatPassword);


        try {
            // 获取浏览器请求访问时携带的cookie中的userId
            Integer userId = LoginUserUtil.releaseUserIdFromCookie(request);
            // 调用Service层修改密码的方法
            userService.updatePassWord(userId, oldPassword, newPassword, repeatPassword);

        } catch (ParamsException p) { // 捕获自定义的异常信息
            resultInfo.setCode(p.getCode());
            resultInfo.setMsg(p.getMsg());
            p.printStackTrace();

        } catch (Exception e) {
            resultInfo.setCode(500);
            resultInfo.setMsg("修改密码失败！");
            e.printStackTrace();
        }

        return resultInfo;
    }

    /**
     * 进入修改密码的页面：通过请求后台，实现页面跳转
     *
     * @return
     */
    @RequestMapping("toPasswordPage")
    public String toPasswordPage() {
        return "user/password";  // 注意：这里并不需要页面的后缀
    }

    /**
     * 查询所有的销售人员
     *
     * @return
     */
    @RequestMapping("queryAllSales")
    @ResponseBody  // 返回的是一个json，所以需要加上@ResponseBody注解
    public List<Map<String, Object>> queryAllSales() {
        return userService.queryAllSales();
    }

}
